package com.zbj.homemade.spring.aop.interceptor;

import com.zbj.homemade.spring.aop.invocation.JoinPoint;
import com.zbj.homemade.spring.aop.invocation.MethodInvocation;

import java.lang.reflect.InvocationTargetException;
import java.lang.reflect.Method;

/**
 * |                    .  ’   *   ‘  .
 * |               _6                    "     o0000o
 * |  o00o _    .%                         %. o0000000o
 * | o000000o.:                              :(0000000o
 * | o00000os                                  .000000o
 * |  o0000/     <b>不了不了,改需求真的伤身体</>   .000o
 * |    o0o                                       .0o
 * |     y        <b>我认为源代码,就是SkrSkr</>     .
 * |    y                                           ,
 * |   y          <b>小熊猫保佑,代码永不修改</>        ,
 * |   p                            .                 .
 * |   p                           @@.                .
 * |    y                        ;@@@;               .
 * |    \                       ;@@@@;.@.          ,;S
 * |     、                     .@@@@@@;       ,@@@@@
 * |     @\.            .****...*@@@@;     .@@@@@@@@@@@.
 * |    @@@@\.     . @@@@@@@@@@@@@@@;    .@@@@@@@@@@@@@@@.
 * |   @@@@@@@@@.@@@@@@@@@@@@@@@@;   .@@@@@@@@@@@@@@@@@@@@@.
 * |  @@@@@@..@@@@..@@@@@@..@@@@@ .@@...@@@@@..@@..@@@@@..@@.
 * | @@@@@@@@..@..@@@@@@@@@@@@@;.@@@..@..@@@..@@....@@@..@@@@.
 * |@y@@@@@@@@..@@@@@@@@..@@@@i@@@@..@@@..@..@@..@@..@..@@@@n@.
 * |@n@@@@@@@..@@@@@@@@..@@@@@@@@@..@@@@@...@@..@@@@...@@@@@n@@.
 * |@@@@@@@@..@@@@@@@@..@@@@@@@@@..@@@@@@@.@@..@@@@@..@@@@@@@@@@.
 * |@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@.
 *
 * @program: principle
 * @description: 以便扩展 ，因为在apect类中可以携带参数
 * @author: Yinn
 * @create: 2019-03-06 17:22
 **/
public class AdviceMethod {

    public static int BEFORE = 1;

    public static int AFTER = 2;

    public static int AFTERRETURNING = 3;

    public static int AFTERTHROWING = 4;

    public static int AROUND = 5;

    /**
     * 执行方法
     */
    private final Method method;

    /**
     * 通知类型
     */
    private final int adviceType;

    /**
     * 切面类实例
     */
    private final Object aspectBean;

    public AdviceMethod(Method method, int adviceType, Object aspectBean) {
        this.method = method;
        this.adviceType = adviceType;
        this.aspectBean = aspectBean;
    }

    public Method getMethod() {
        return method;
    }

    public int getAdviceType() {
        return adviceType;
    }

    Object invoke(MethodInvocation mi) throws InvocationTargetException, IllegalAccessException {

        return method.invoke(aspectBean, mi.getArgs());

    }

}
